#include "ringbuffer.h"
#include "command.h"
#include "usart.h"


/* 缓冲区信息 */
UART_S uart;

/* 接收到的数据 */
uint8_t rev_data;


/**
 * @brief   将一个字符放入缓存区，并将存放的位置+1。
 *
 * @param   ch		要存放的字符
 *
 * @return  none
 */
void uart_buf_put(uint8_t ch)
{
	uart.buf[uart.in++] = ch;
	if(uart.in == UART_RX_MAX)
	{
		uart.in = 0;
	}
}


/**
 * @brief   将一个字符从缓存区取出，并将取出的位置+1。
 *
 * @param   ch		取出的字符的存放地址
 *
 * @return  int		1表示取出成功，0表示没有数据可以取。
 */
int uart_buf_get(uint8_t *ch)
{
	if(uart.in != uart.out)
	{
		*ch = uart.buf[uart.out++];
		if(uart.out == UART_RX_MAX)
		{
			uart.out = 0;
		}
		return 1;
	}
	return 0;
}


/**
 * @brief   读取缓冲区数据的函数
 *
 * @param   none
 *
 * @return  none
 */
void debug_read(void)
{
	uint8_t ch;
	if(uart_buf_get(&ch))
	{
		/* ========= 以下是自己的处理逻辑 ========= */
		
		// printf("%02X, %c, \r\n" ,ch, ch);
		at_proc(ch);
		 
		/* ========= 以上是自己的处理逻辑 ========= */
	}
}


/**
 * @brief   开启接收中断。
 *
 * @param   none
 *
 * @return  none
 */
void uart_rev_enable(void)
{
	HAL_UART_Receive_IT(&huart1, &rev_data, 1);
}


/**
 * @brief   接收到一个字节，将其放入缓冲区，并重新开启中断。(在中断处理函数中调用)
 *
 * @param   none
 *
 * @return  none
 */
void uart_it_cb(void)
{
	uart_buf_put(rev_data);
	uart_rev_enable();
}


/**
 * @brief   串口初始化（其实就是开启接收中断）在main.c中while(1)之前调用
 *
 * @param   none
 *
 * @return  none
 */ 
void uart_init(void)
{
	uart_rev_enable();
}
